package model;

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

// 通过这个类, 去封装数据库建立连接的操作.
// 由于我们接下来代码中有多个servlet都需要 使用 数据库, 就需要有一个单独的地方来把 DataSource 这里进行封装
// 而不能只是放到 某个 Servlet 的init 中了
// 此处可以使用单例模式来表示 dataSource
public class DBUtil {
    private volatile static DataSource dataSource = null;

    //使用懒汉模式
    private static DataSource getDataSource(){
        if(dataSource==null) {
            synchronized (DBUtil.class) {
                if (dataSource == null) {
                    dataSource = new MysqlDataSource();
                    ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109_blog_system?characterEncoding=utf8&&useSSL=false");
                    ((MysqlDataSource) dataSource).setUser("root");
                    ((MysqlDataSource) dataSource).setPassword("");
                }
            }
        }
        return dataSource;
    }
    // 注意当前的 懒汉模式 是线程不安全的.
    // 当前的 Servlet 本身就是在多线程环境下执行的
    //

    // 提供一个建立连接的方法
    public static Connection getConnection() throws SQLException {
        return getDataSource().getConnection();
    }

    // 关闭资源的方法
    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){

            if(resultSet != null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);   //抛异常单独每个单独使用的 目的是 前面的有任何一个抛异常不影响到后面的代码的执行
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }

    }
}
